package com.designPattern.singleton;

/**
 * @author mxs
 * 【单例模式】
 * 【懒汉式的改进】
 * 【double check双重检查】
 * 双重检查是在同步代码块中再增加一个判断isntance == null的语句，哪怕是有多个线程进入了同步代码块
 * 都不会再创建多一个Instance对象
 * 【优点】线程安全，符合lazy loading（在使用方法的时候才创建对象），执行速度也比较快
 * 【重点】在开发中会使用这种单例模式
 */
public class Type4 {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(){
                @Override
                public void run() {
                    Instance instance = Singleton4.getInstance();
                    System.out.println(Thread.currentThread().getName() + ":" + instance.hashCode());
                }
            }.start();
        }
    }
}

class Singleton4 {
    //私有化内部构造器，放置外部直接初始化 Instance 对象
    private Singleton4() {
    }

    private static volatile Instance instance;

    public static Instance getInstance() {
        if (instance == null) {
            synchronized (Singleton4.class) {
                if (instance == null) {
                    instance = new Instance();
                }

            }
        }
        return instance;
    }
}
